#include "asduparse.h"
#include <QString>

ASDUparse::ASDUparse(QObject *parent) :
    QObject(parent)
{
}
//********************************************************************************
//函数名：void strAsduTypeName()
//功能：   获取ASDU类型名称
QString ASDUparse::strAsduTypeName(const QString &data_parse)
{
    int i=data_parse.mid(c_typenode,2).toInt(&ok,16);
    //取ASDU101类型名称
    _p_type=i;//->设定类型值
    QString strAsduTypeName;
    switch(i)
    {
    case M_SP_NA_1:		// 单点信息
        strAsduTypeName="不带时标单点信息(M_SP_NA_1)";
        break;
    case M_SP_TA_1:
        strAsduTypeName=" :带时标单点信息(M_SP_TA_1)";
        break;
    case M_DP_NA_1:		// 双点信息
        strAsduTypeName=" :不带时标双点信息(M_DP_NA_1)";
        break;
    case M_DP_TA_1:
        strAsduTypeName =" :带时标双点信息(M_DP_TA_1)";
        break;
    case M_ST_NA_1:		// 步位置信息(变压器分接头信息)
        strAsduTypeName =" :不带时标步位置信息(M_ST_NA_1)";
        break;
    case M_ST_TA_1:
        strAsduTypeName =" :带时标步位置信息(M_ST_TA_1)";
        break;
    case M_BO_NA_1:		// 子站远动终端状态
        strAsduTypeName =" :子站远动终端状态(M_BO_NA_1)";
        break;
    case M_BO_TA_1:		// 有时标的块数据
        strAsduTypeName =" :有时标的块数据(M_BO_TA_1)";
        break;
    case M_ME_NA_1:		// 带品质描述不带时标的遥测数据
        strAsduTypeName =" :带品质描述的遥测数据(M_ME_NA_1)";
        break;
    case M_ME_TA_1:		// 带品质描述带时标的遥测数据
        strAsduTypeName =" :带品质描述带时标的遥测数据(M_ME_TA_1)";
        break;
    case M_ME_NB_1:		// 测量值, 标度化值, Normalize Value, Without Time Stamp
        strAsduTypeName =" :带品质描述的标度化值(M_ME_NB_1)";
        break;
    case M_ME_TB_1:		// 测量值, 带时标的标度化值, Normalize Value, With Time Stamp
        strAsduTypeName =" :带时标的标度化值(M_ME_TB_1)";
        break;
    case M_ME_NC_1:		// 测量值, 短浮点数, Scaled Value, short floating Without Time Stamp
        strAsduTypeName =" :短浮点数(M_ME_NC_1)";
        break;
    case M_ME_TC_1:		// 测量值, 带时标的短浮点数, Scaled Value, short floating With Time Stamp
        strAsduTypeName =" :带时标的短浮点数(M_ME_TC_1)";
        break;
    case M_IT_NA_1:	// 电能脉冲计数
        strAsduTypeName =" :电能脉冲计数(M_IT_NA_1)";
        break;
    case M_IT_TA_1:
        strAsduTypeName =" :带时标电能脉冲计数(M_IT_TA_1)";
        break;
    case M_EP_TA_1:		// 带时标的继电保护或重合闸设备单个事件
        strAsduTypeName =" :继电保护装置成组启动事件(M_EP_TA_1)";
        break;
    case M_EP_TB_1:		// 带时标的继电保护装置成组启动事件
        strAsduTypeName =" :继电保护装置成组启动事件(M_EP_TB_1)";
        break;
    case M_EP_TC_1:		// 带时标的继电保护装置成组输出电路信息事件
        strAsduTypeName =" :继电保护装置成组输出电路信息事件(M_EP_TC_1)";
        break;
    case M_PS_TA_1:		// 具有状态变位检出的成组单点信息
        strAsduTypeName =" :具有状态变位检出的成组单点信息(M_PS_TA_1)";
        break;
    case M_ME_ND_1:		// 不带品质描述测量值
        strAsduTypeName =" :不带品质描述测量值(M_ME_ND_1)";
        break;
    case VERDOR_EXTEND_22:
    case VERDOR_EXTEND_23:
    case VERDOR_EXTEND_24:
    case VERDOR_EXTEND_25:
    case VERDOR_EXTEND_26:
    case VERDOR_EXTEND_27:
    case VERDOR_EXTEND_28:
    case VERDOR_EXTEND_29:
        strAsduTypeName =" :用户扩展";
        break;
    case M_SP_TB_1: // 带CP56Time2a时标的单点信息
        strAsduTypeName =" :带CP56Time2a时标的单点信息(M_SP_TB_1)";
        break;
    case M_DP_TB_1:		// 带CP56Time2a时标的双点信息
        strAsduTypeName =" :带CP56Time2a时标的双点信息(M_DP_TB_1)";
        break;
    case M_ST_TB_1:		// 带CP56Time2a时标的步位置信息
        strAsduTypeName =" :带CP56Time2a时标的步位置信息(M_ST_TB_1)";
        break;
    case M_BO_TB_1:		// 带CP56Time2a时标的32比特串
        strAsduTypeName =" :带CP56Time2a时标的32比特串(M_BO_TB_1)";
        break;
    case M_ME_TD_1:		// 带CP56Time2a时标的测量值, 规一化值
        strAsduTypeName =" :带CP56Time2a时标的规一化值(M_ME_TD_1)";
        break;
    case M_ME_TE_1:		// 带CP56Time2a时标的测量值, 标度化值
        strAsduTypeName =" :带CP56Time2a时标的标度化值(M_ME_TE_1)";
        break;
    case M_ME_TF_1:		// 带CP56Time2a时标的测量值, 短浮点数
        strAsduTypeName =" :带CP56Time2a时标的短浮点数(M_ME_TF_1)";
        break;
    case M_IT_TB_1:		// 带CP56Time2a时标的累计量
        strAsduTypeName =" :带CP56Time2a累计量(M_ME_TF_1)";
        break;
    case M_EP_TD_1:		// 带CP56Time2a时标的继电保护装置事件
        strAsduTypeName =" :带CP56Time2a装置事件(M_EP_TD_1)";
        break;
    case M_EP_TE_1:		// 带CP56Time2a时标的继电保护装置成组启动事件
        strAsduTypeName =" :带CP56Time2a成组启动事件(M_EP_TE_1)";
        break;
    case M_EP_TF_1:		// 带CP56Time2a时标的继电保护装置成组输出电路信息
        strAsduTypeName =" :带CP56Time2a成组输出电路信息(M_EP_TF_1)";
        break;
    case M_BD_NA_1:	// BDC码(水位值)
        strAsduTypeName =" :BDC码(水位值)(M_BD_NA_1)";
        break;
        // 主站->子站 在控制方向的过程信息
    case C_DC_NA_1:	// 双点遥控命令
        strAsduTypeName =" :双点遥控命令(C_DC_NA_1)";
        break;
    case C_RC_NA_1:		// 升降命令
        strAsduTypeName =" :升降命令(C_RC_NA_1)";
        break;
    case C_SE_NA_1:		// 设定命令
        strAsduTypeName =" :设定命令(C_RC_NA_1)";
        break;
    case C_BO_NA_1:  //  32位的位串
        strAsduTypeName =" :32位的位串(C_BO_NA_1)";
        break;
        // 子站->主站  在监视方向的系统信息
    case M_EI_NA_1:	// 初始化结束
        strAsduTypeName =" :初始化结束(M_EI_NA_1)";
        break;
        // 主站到子站，在控制方向的系统信息
    case C_IC_NA_1:		// 召唤命令
        strAsduTypeName =" :召唤命令(C_IC_NA_1)";
        break;
    case C_CI_NA_1:		// 电能脉冲召唤命令
        strAsduTypeName =" :电能脉冲召唤命令(C_CI_NA_1)";
        break;
    case C_RD_NA_1:		// 读数据命令
        strAsduTypeName =" :读数据命令(C_RD_NA_1)";
        break;
    case C_CS_NA_1:		// 时钟同步命令
        strAsduTypeName =" :时钟同步命令(C_CS_NA_1)";
        break;
    case C_TS_NA_1:		// 测试命令
        strAsduTypeName =" :测试命令(C_TS_NA_1)";
        break;
    case C_RP_NA_1:		// 复位进程命令
        strAsduTypeName =" :复位进程命令(C_RP_NA_1)";
        break;
    case C_CD_NA_1:		// 延时获得命令
        strAsduTypeName =" :延时获得命令(C_CD_NA_1)";
        break;
        // 在控制方向上的参数
    case P_ME_NA_1:		// 装载参数命令
        strAsduTypeName =" :装载参数命令(P_ME_NA_1)";
        break;
    case P_AC_NA_1:		// 激活参数
        strAsduTypeName =" :激活参数(P_AC_NA_1)";
        break;
        // 文件参数
    case F_FR_NA_1:		// 文件已准备好
        strAsduTypeName =" :文件已准备好(F_FR_NA_1)";
        break;
    case F_SR_NA_1:			// 节已准备好
        strAsduTypeName =" :节已准备好(F_SR_NA_1)";
        break;
    case F_SC_NA_1:			// 召唤目录、选择文件、召唤文件、召唤节
        strAsduTypeName =" :召唤目录(节、文件)(F_SC_NA_1)";
        break;
    case F_LS_NA_1:			// 最后的节、最后的段
        strAsduTypeName =" :最后的节、最后的段(F_LS_NA_1)";
        break;
    case F_AF_NA_1:			// 确认文件、确认节
        strAsduTypeName =" :确认文件、确认节(F_AF_NA_1)";
        break;
    case F_SG_NA_1:			// 段
        strAsduTypeName =" :段(F_SG_NA_1)";
        break;
    case F_DR_NA_1:			// 目录
        strAsduTypeName =" :目录(F_DR_NA_1)";
        break;
    default:
        strAsduTypeName =" :(未知)";
        break;
    }
    return tr("%1-----").arg(data_parse.mid(c_typenode,2))+strAsduTypeName;
}


//********************************************************************************
//函数名：void strGetCanChange()
//功能：   获取可变结构限定词
QString ASDUparse::strGetCanChange(const QString data_parse)
{
    QString l_lishun;
    int l_i_lishun;
    //记录报文所含信息数目：
    //区别离散和顺序
    if((data_parse.mid(c_canChange,2).toInt(&ok,16)>>7)%2==0)
    {
        _p_sq=0;//->sq
        l_lishun="SQ=0：离散的信息报告";
        l_i_lishun=data_parse.mid(c_canChange,2).toInt(&ok,16);
        _p_vsq=l_i_lishun;

    }
    else
    {
        _p_sq=1;//->sq

        l_lishun="SQ=1：顺序的信息报告";
        l_i_lishun=data_parse.mid(c_canChange,2).toInt(&ok,16)-128;
        _p_vsq=l_i_lishun;
    }


    return tr("%1----可变结构限定词VSQ--信息数目：%2----%3")
            .arg(data_parse.mid(c_canChange,2))
            .arg(l_i_lishun)
            .arg(l_lishun);
}

//********************************************************************************
//函数名：void strGetReasonName()
//功能：   获取传送原因名称
QString ASDUparse::strGetReasonName(const QString &data_parse)
{
        //取传输原因名称
        QString strReason;
        int i=data_parse.mid(c_transferReason,2).toInt(&ok,16);
        switch(i)//  REASON)
        {
        case 	ASDU101_TR_PER:	//1. 周期.循环
            strReason="周期.循环";
            break;
        case 	ASDU101_TR_BACK:	//2 背景扫描
            strReason="背景扫描";
            break;
        case 	ASDU101_TR_SPONT:  //3 突发
            strReason="突发";
            break;
        case 	ASDU101_TR_INIT:   //4 初始化
            strReason="初始化";
            break;
        case 	ASDU101_TR_REQ:	//5 请求或被请求
            strReason="请求或被请求";
            break;
        case 	ASDU101_TR_ACT:	//6 激活
            strReason="激活";
            break;
        case 	ASDU101_TR_ACTCON:	//7 激活确认
            strReason="激活确认";
            break;
        case 	ASDU101_TR_DEACT:	//8 停止激活
            strReason="停止激活";
            break;
        case 	ASDU101_TR_DEACTCON:	//9 停止激活确认
            strReason="停止激活确认";
            break;
        case 	ASDU101_TR_ACTTERM:	//10 激活结束
            strReason="激活结束";
            break;
        case 	ASDU101_TR_RETREM:		//11 远程命令引起的返送信息
            strReason="远程命令引起的返送信息";
            break;
        case 	ASDU101_TR_RETLOC:		//12 当地命令引起的返送信息
            strReason="当地命令引起的返送信息";
            break;
        case 	ASDU101_TR_FILE:		//13 文件传送
            strReason="文件传送";
            break;
        case 	ASDU101_TR_INTROGEN:	//20 响应总召唤
            strReason="响应总召唤";
            break;
        case 	ASDU101_TR_INTRO1:			//21 响应第1组召唤
            strReason="响应第1组召唤";
            break;
        case 	ASDU101_TR_INTRO2:			//22 响应第2组召唤
            strReason="响应第2组召唤";
            break;
        case 	ASDU101_TR_INTRO3:			//23 响应第3组召唤
            strReason="响应第3组召唤";
            break;
        case 	ASDU101_TR_INTRO4:			//24 响应第4组召唤
            strReason="响应第4组召唤";
            break;
        case 	ASDU101_TR_INTRO5:			//25 响应第5组召唤
            strReason="响应第5组召唤";
            break;
        case 	ASDU101_TR_INTRO6:			//26 响应第6组召唤
            strReason="响应第6组召唤";
            break;
        case 	ASDU101_TR_INTRO7:			//27 响应第7组召唤
            strReason="响应第7组召唤";
            break;
        case 	ASDU101_TR_INTRO8:			//28 响应第8组召唤
            strReason="响应第8组召唤";
            break;
        case 	ASDU101_TR_INTRO9:			//29 响应第9组召唤
            strReason="响应第9组召唤";
            break;
        case 	ASDU101_TR_INTRO10:			//30 响应第10组召唤
            strReason="响应第10组召唤";
            break;
        case 	ASDU101_TR_INTRO11:			//31 响应第11组召唤
            strReason="响应第11组召唤";
            break;
        case 	ASDU101_TR_INTRO12:			//32 响应第12组召唤
            strReason="响应第12组召唤";
            break;
        case 	ASDU101_TR_INTRO13:			//33 响应第13组召唤
            strReason="响应第13组召唤";
            break;
        case 	ASDU101_TR_INTRO14:			//34 响应第14组召唤
            strReason="响应第14组召唤";
            break;
        case 	ASDU101_TR_INTRO15:			//35 响应第15组召唤
            strReason="响应第15组召唤";
            break;
        case 	ASDU101_TR_INTRO16:			//36 响应第16组召唤
            strReason="响应第16组召唤";
            break;
        case 	ASDU101_TR_REQCOGCN:			//37 响应计数量总召唤
            strReason="响应计数量总召唤";
            break;
        case 	ASDU101_TR_REQCO1:				//38 响应第1组计数量召唤
            strReason="响应第1组计数量召唤";
            break;
        case 	ASDU101_TR_REQCO2:				//39 响应第2组计数量召唤
            strReason="响应第2组计数量召唤";
            break;
        case 	ASDU101_TR_REQCO3:				//40 响应第3组计数量召唤
            strReason="响应第3组计数量召唤";
            break;
        case 	ASDU101_TR_REQCO4:				//41 响应第4组计数量召唤
            strReason="响应第4组计数量召唤";
            break;
        default:
            strReason="未知";
            break;
        }
        return tr("%1-----").arg(data_parse.mid(c_transferReason,2))+strReason;
}


//********************************************************************************
//函数名：QString srtGetAddress()
//功能：   创建地址节点：
QString ASDUparse::strGetAddress(const QString data_parse)
{
    //后8位组+前8位组拼接字符串
    QString l_address=data_parse.mid(c_commenAddress+2,2)+data_parse.mid(c_commenAddress,2);
    int l_i_address=l_address.toInt(&ok,16);
    return tr("%1----公共地址：（前高后低）%2")
                                          .arg(data_parse.mid(c_commenAddress,4))
            .arg(l_i_address);
}


//********************************************************************************
//函数名：getType
//功能：   获取类型节点
int ASDUparse::getType()
{
    return _p_type;
}

//********************************************************************************
//函数名：getSq
//功能：   获取sq
int ASDUparse::getSq()
{
    return _p_sq;
}

//********************************************************************************
//函数名：getVsq
//功能：   vsq
int ASDUparse::getVsq()
{
    return _p_vsq;
}


